package cn.mavor.day0929;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileEncryptDecrypt {

    private static final String TEMP_FILE_SUFFIX = ".tmp";

    /**
     * 加密文件：读出每一个字节，取反(~)后，写入新文件，
     * 然后删除原文件，把新文件改成原文件同名的文件。
     */
    public static void encryptFile(String filePath) throws IOException {
        processFile(filePath, true);
    }

    /**
     * 解密文件：与加密过程相反，同样是对每个字节取反。
     */
    public static void decryptFile(String filePath) throws IOException {
        processFile(filePath, false);
    }

    /**
     * 处理文件加密或解密。
     *
     * @param filePath 文件路径。
     * @param isEncrypt 如果为true则执行加密，否则执行解密。
     */
    private static void processFile(String filePath, boolean isEncrypt) throws IOException {
        File originalFile = new File(filePath);
        File tempFile = new File(filePath + TEMP_FILE_SUFFIX);

        try (FileInputStream fis = new FileInputStream(originalFile);
             FileOutputStream fos = new FileOutputStream(tempFile)) {

            int b;
            while ((b = fis.read()) != -1) {
                // 对字节取反
                byte encryptedByte = (byte) (~b);
                fos.write(encryptedByte);
            }
        }

        // 删除原始文件并重命名临时文件为原始文件名
        if (!originalFile.delete()) {
            throw new IOException("无法删除原始文件：" + filePath);
        }
        if (!tempFile.renameTo(originalFile)) {
            throw new IOException("无法将临时文件重命名为：" + filePath);
        }

        System.out.println(isEncrypt ? "文件加密完成" : "文件解密完成");
    }

    public static void main(String[] args) {
        if (args.length < 2) {
            System.out.println("用法: java FileEncryptDecrypt <文件路径> <加密|解密>");
            return;
        }

        String filePath = args[0];
        String operation = args[1].toLowerCase();

        try {
            if ("加密".equals(operation)) {
                encryptFile(filePath);
            } else if ("解密".equals(operation)) {
                decryptFile(filePath);
            } else {
                System.out.println("无效的操作类型，请输入'加密'或'解密'");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}